// @noEmit: true
// @allowJs: true
// @checkJs: true
// @Filename: first.js
/**
 * @constructor
 * @param {number} numberOxen
 */ function Wagon(numberOxen) {
    this.numberOxen = numberOxen;
}
/** @param {Wagon[]=} wagons */ Wagon.circle = function(wagons) {
    return wagons ? wagons.length : 3.14;
};
/** @param {*[]=} supplies - *[]= is my favourite type */ Wagon.prototype.load = function(supplies) {
};
/** @param {*[]=} supplies - Yep, still a great type */ Wagon.prototype.weight = (supplies)=>supplies ? supplies.length : -1
;
Wagon.prototype.speed = function() {
    return this.numberOxen / this.weight();
};
// ok
class Sql extends Wagon {
    /**
     * @param {Array.<string>} files
     * @param {"csv" | "json" | "xmlolololol"} format
     * This is not assignable, so should have a type error
     */ load(files, format) {
        if (format === "xmlolololol") {
            throw new Error("please do not use XML. It was a joke.");
        } else {
            super.speed() // run faster
            ;
            if (super.weight() < 0) {
            // ????????????????????????
            }
        }
    }
    constructor(){
        super(); // error: not enough arguments
        this.foonly = 12;
    }
}
var db = new Sql();
db.numberOxen = db.foonly;
// error, can't extend a TS constructor function
class Drakkhen extends Dragon {
}
// @Filename: second.ts
/**
 * @constructor
 */ function Dragon(numberEaten) {
    this.numberEaten = numberEaten;
}
// error!
class Firedrake extends Dragon {
    constructor(){
        super();
    }
}
// ok
class Conestoga extends Wagon {
    // should error since others is not optional
    static circle(others) {
        return others.length;
    }
    constructor(drunkOO){
        // error: wrong type
        super('nope');
        this.drunkOO = drunkOO;
    }
}
var c = new Conestoga(true);
c.drunkOO;
c.numberOxen;
// @Filename: generic.js
/**
 * @template T
 * @param {T} flavour
 */ function Soup(flavour) {
    this.flavour = flavour;
}
/** @extends {Soup<{ claim: "ignorant" | "malicious" }>} */ class Chowder extends Soup {
    log() {
        return this.flavour;
    }
}
var soup = new Soup(1);
soup.flavour;
var chowder = new Chowder({
    claim: "ignorant"
});
chowder.flavour.claim;
var errorNoArgs = new Chowder();
var errorArgType = new Chowder(0);
